import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from joblib import load

class NN(object):
    def __init__(self):
        # 加载预训练好的Keras模型
        self.loaded_model = tf.keras.models.load_model('timing/my_model.keras')
        # 加载用于数据归一化的scaler对象
        self.scaler = load('timing/scaler.joblib')

    def get_hourly_trend(self):
        # 设置时间步长（使用7天的数据进行预测）
        n_steps = 7
        # 读取景点数据CSV文件
        df_pivot = pd.read_csv('timing/scenic_data.csv')
        # 获取最后7天的数据
        x_values = df_pivot.iloc[-n_steps:]
        # 将最新一天的count值设为0（可能是为了预测未来值）
        x_values.iloc[-1, x_values.columns.get_loc('count')] = 0
        # 提取数值部分
        latest_data = x_values.values
        # 调整数据形状为LSTM模型需要的格式：(样本数, 时间步长, 特征数)
        latest_data = latest_data.reshape(1, n_steps, latest_data.shape[1])

        # 使用模型进行预测
        predicted = self.loaded_model.predict(latest_data)
        # 将归一化的预测结果反归一化，得到实际值
        predicted_counts = self.scaler.inverse_transform(predicted)
        # 将负值设为0（人数不可能为负）
        predicted_counts[predicted_counts < 0] = 0
        # 将预测结果转换为整数列表
        hourly_trend = predicted_counts[0].astype(int).tolist()

        # 打印每小时趋势预测结果
        print(hourly_trend)

if __name__ == '__main__':
    # 创建NN类的实例
    nn = NN()
    # 调用方法获取每小时趋势预测
    nn.get_hourly_trend()